package com.asm.repository;

import com.asm.entity.sys.Spot;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;

/**
 * @author ZhuangGuiMan
 */
@Repository
public interface SpotRepository extends JpaRepository<Spot, Long> {

    /**
     * 根据广告位编号查询广告位
     *
     * @param id 广告位编号
     * @return 广告位
     */
    @Query("select s from Spot s where s.id=:id and s.isDel=false ")
    Spot findSpotById(@Param("id") Long id);

    /**
     * 根据用户Id和档期查询广告位Id
     *
     * @param userId    用户Id
     * @param spotId    广告位id
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 广告位Id
     */
    @Query("select b.spotId as spotId from Book b where b.isDel=false " +
            "and b.customerId=?1 and b.spotId=?2 and b.startDate=?3 and b.endDate=?4")
    Long findByUserIdAndSchedule(Long userId, Long spotId, Date startDate, Date endDate);

    /**
     * 根据广告位类型分页查询广告位
     *
     * @param type     广告位类型
     * @param isDel    是否被删除
     * @param pageable 分页
     * @return 广告位
     */
    Page<Spot> findBySpotTypeAndIsDel(String type, Boolean isDel, Pageable pageable);

    /**
     * 根据广告位大小分页查询广告位
     *
     * @param size     广告位大小
     * @param isDel    是否被删除
     * @param pageable 分页
     * @return 广告位
     */
    Page<Spot> findBySpotSizeAndIsDel(String size, Boolean isDel, Pageable pageable);

    /**
     * 根据小区编号查询广告位
     *
     * @param communityId 小区ID
     * @param isDel       是否被删除
     * @param pageable    分页对象
     * @return 广告位
     */
    Page<Spot> findByCommunityIdAndIsDel(Long communityId, Boolean isDel, Pageable pageable);

    /**
     * 查询所有广告位
     *
     * @param of 分页
     * @return 广告位
     */
    @Query("select c from Spot c where c.isDel=false ")
    Page<Spot> findAll(PageRequest of);

    /**
     * 计算广告位总数
     *
     * @return 广告位总数
     */
    @Query("select count(c) from Spot c where c.isDel=false ")
    int countTotalNumber();

    /**
     * 计算空闲广告位总数
     *
     * @return 空闲广告位总数
     */
    @Query("select count(c) from Spot c  where c.isDel=false and c.isBusy=false ")
    int countFreeNumber();

    /**
     * 计算正在使用的广告位总数
     *
     * @return 正在使用的广告位总数
     */
    @Query("select  count(c) from Spot c where c.isBusy=true and c.isRepair=false and c.isDel=false ")
    int countInUse();

    /**
     * 计算过期的广告位总数
     *
     * @return 过期的广告位总数
     */
    @Query(value = "SELECT DISTINCT COUNT(*) FROM t_contract as a " +
            "JOIN t_contract_contain as b ON a.is_del=b.is_del " +
            "AND a.id=b.contract_id " +
            "WHERE DATEDIFF(CURRENT_DATE, a.contract_end_date)  <= 5 " +
            "AND DATEDIFF(CURRENT_DATE, a.contract_end_date)  <= 0 " +
            "AND a.is_del=0"
            , nativeQuery = true)
    int countExpire();

    /**
     * 计算正在维修的广告位总数
     *
     * @return 正在维修的广告位总数
     */
    @Query("select  count(c) from Spot c where c.isRepair=true and c.isDel=false ")
    int countRepair();

    /**
     * 根据广告位Id查询档期最晚结束时间
     *
     * @param spotId 广告位Id
     * @return 最晚时间
     */
    @Query("select max (c.contractEndDate) as latestDate from ContractContain cc inner join Contract c " +
            "on cc.contractId=c.id inner join Spot s on cc.spotId=s.id where s.isDel=false and cc.spotId=?1")
    Date getLatestReserveDateBySpotId(Long spotId);
}
